package school.community.service;

import school.community.dto.CommentDTO;
import school.community.enums.CommentTypeEnum;
import school.community.enums.NotificationTypeEnum;
import school.community.exception.CustomizeErrorCode;
import school.community.exception.CustomizeException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import school.community.mapper.*;
import school.community.model.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class CommentService {

  @Autowired
  private CommentMapper commentMapper;

  @Autowired
  private InfoMapper infoMapper;

  @Autowired
  private InfoExtMapper infoExtMapper;

  @Autowired
  private UserMapper userMapper;

  @Autowired
  private CommentExtMapper commentExtMapper;

  @Autowired
  private NotificationMapper notificationMapper;

  @Autowired
  private NotificationService notificationService;

  @Transactional
  public void insert(Comment comment, User commentator) {
    if (comment.getParentId() == null || comment.getParentId() == 0) {
      throw new CustomizeException(CustomizeErrorCode.TARGET_PARAM_NOT_FOUND);
    }
    if (comment.getType() == null || !CommentTypeEnum.isExist(comment.getType())) {
      throw new CustomizeException(CustomizeErrorCode.TYPE_PARAM_WRONG);
    }

//    NotificationService notificationService = new NotificationService();
    if (comment.getType() == CommentTypeEnum.COMMENT.getType()) {
      // 回复评论
      Comment dbComment = commentMapper.selectByPrimaryKey(comment.getParentId());
      if (dbComment == null) {
        throw new CustomizeException(CustomizeErrorCode.COMMENT_NOT_FOUND);
      }

      // 回复问题
      Info info = infoMapper.selectByPrimaryKey(dbComment.getParentId());

      if (info == null) {
        throw new CustomizeException(CustomizeErrorCode.QUESTION_NOT_FOUND);
      }

      commentMapper.insert(comment);

      // 增加评论数
      Comment parentComment = new Comment();
      parentComment.setId(comment.getParentId());
      parentComment.setCommentCount(1);
      commentExtMapper.incCommentCount(parentComment);

      // 创建通知
      notificationService.createNotify(comment, dbComment.getCommentator(), commentator.getName(), info.getTitle(), NotificationTypeEnum.REPLY_COMMENT, info.getId());
    } else {
      // 回复问题
      Info info = infoMapper.selectByPrimaryKey(comment.getParentId());
      if (info == null) {
        throw new CustomizeException(CustomizeErrorCode.QUESTION_NOT_FOUND);
      }
      comment.setCommentCount(0);
      commentMapper.insert(comment);
      info.setCommentCount(1);
      infoExtMapper.incCommentCount(info);

      // 创建通知
      notificationService.createNotify(comment, info.getCreator(), commentator.getName(), info.getTitle(), NotificationTypeEnum.REPLY_TALK, info.getId());
    }
  }

//  public void createNotify(Comment comment, Long receiver, String notifierName, String outerTitle, NotificationTypeEnum notificationType, Long outerId) {
//    if (receiver == comment.getCommentator()) {
//      return;
//    }
//    Notification notification = new Notification();
//    notification.setGmtCreate(System.currentTimeMillis());
//    notification.setType(notificationType.getType());
//    notification.setOuterid(outerId);
//    notification.setNotifier(comment.getCommentator());
//    notification.setStatus(NotificationStatusEnum.UNREAD.getStatus());
//    notification.setReceiver(receiver);
//    notification.setNotifierName(notifierName);
//    notification.setOuterTitle(outerTitle);
//    notificationMapper.insert(notification);
//  }

  public List<CommentDTO> listByTargetId(Long id, CommentTypeEnum type) {
    CommentExample commentExample = new CommentExample();
    commentExample.createCriteria()
            .andParentIdEqualTo(id)
            .andTypeEqualTo(type.getType());
    commentExample.setOrderByClause("gmt_create desc");
    List<Comment> comments = commentMapper.selectByExample(commentExample);

    if (comments.size() == 0) {
      return new ArrayList<>();
    }
    // 获取去重的评论人
    Set<Long> commentators = comments.stream().map(comment -> comment.getCommentator()).collect(Collectors.toSet());
    List<Long> userIds = new ArrayList();
    userIds.addAll(commentators);


    // 获取评论人并转换为 Map
    UserExample userExample = new UserExample();
    userExample.createCriteria()
            .andIdIn(userIds);
    List<User> users = userMapper.selectByExample(userExample);
    Map<Long, User> userMap = users.stream().collect(Collectors.toMap(user -> user.getId(), user -> user));


    // 转换 comment 为 commentDTO
    List<CommentDTO> commentDTOS = comments.stream().map(comment -> {
      CommentDTO commentDTO = new CommentDTO();
      BeanUtils.copyProperties(comment, commentDTO);
      commentDTO.setUser(userMap.get(comment.getCommentator()));
      return commentDTO;
    }).collect(Collectors.toList());

    return commentDTOS;
  }
}
